package org.gm.mybatis.ext.service;

import java.io.Serializable;
import java.util.List;
import java.util.Map;

import org.apache.ibatis.annotations.Param;
import org.gm.mybatis.ext.sql.SqlQuery;

public interface BaseService<T, E> {
	
	/**
	 * 条件查询记录数统计
	 * @param example POJO条件对象
	 * @return
	 */
	int countByExample(E example);
	
	/**
     * 自由查询查询记录数统计
     * @param params 自由查询配置对象
     * @return
     */
    int countBySqlQuery(SqlQuery sqlQuery);
    
    /**
     * 删除符合条件的数据
     * @param example POJO条件对象
     * @return
     */
    int deleteByExample(E example);

    /**
     * 根据主键值删除数据
     * @param id POJO实体对象主键值
     * @return
     */
    int deleteByPrimaryKey(Serializable id);

    /**
     * 插入新对象数据
     * @param record POJO实体对象
     * @return
     */
    int insert(T record);

    /**
     * 插入新对象数据，仅仅包含有值的属性数据
     * @param record POJO实体对象
     * @return
     */
    int insertSelective(T record);

    /**
     * 查询符合条件的对象数据
     * @param example POJO条件对象
     * @return
     */
    List<T> selectByExample(E example);
    
    /**
     * 查询符合条件的对象数据，包含关联对象数据
     * @param example POJO条件对象
     * @return
     */
    List<T> selectRelationByExample(E example);

    /**
     * 根据主键值查询对象数据
     * @param id POJO实体对象主键值
     * @return
     */
    T selectByPrimaryKey(Serializable id);
    
    /**
     * 根据主键值查询对象数据，包含关联对象数据
     * @param id
     * @return
     */
    T selectRelationByPrimaryKey(Serializable id);
    
    /**
     * 自由sql查询
     * @param sqlQuery 自由查询配置对象
     * @return
     */
    List<Map<String, Object>> selectBySqlQuery(SqlQuery sqlQuery);

    /**
     * 根据条件更新对象数据，仅仅包含有值的属性数据
     * @param record POJO实体对象
     * @param example POJO条件对象
     * @return
     */
    int updateByExampleSelective(@Param("record") T record, @Param("example") E example);

    /**
     * 根据条件更新对象数据
     * @param record POJO实体对象
     * @param example POJO条件对象
     * @return
     */
    int updateByExample(@Param("record") T record, @Param("example") E example);

    /**
     * 根据主键更新对象数据
     * @param record POJO实体对象
     * @return
     */
    int updateByPrimaryKeySelective(T record);

    /**
     * 根据主键更新对象数据，仅仅包含有值的属性数据
     * @param record POJO实体对象
     * @return
     */
    int updateByPrimaryKey(T record);
    
    /**
     * 自由更新数据数数据
     * @param sqlQuery 自由更新配置对象
     * @return
     */
    int updatebySqlQuery(SqlQuery sqlQuery);
    
    /**
     * 根据条件将MAP对象更新到数据库
     * @param record
     * @param example
     * @return
     */
    int updateFromMapByExample(Map<String, ?> record, E example);
    
    /**
     * 根据条件进行分页查询
     * @param example 查询条件对象
     * @param page 当前页码
     * @param pageSize 页码显示的记录数
     * @return
     */
    PageResult<T> pageByExample(E example, int page, int pageSize) throws Exception;
    
    /**
     * 根据条件进行分页查询，包含关联对象数据
     * @param example 查询条件对象
     * @param page 当前页码
     * @param pageSize 页码显示的记录数
     * @return
     */
    PageResult<T> pageRelationByExample(E example, int page, int pageSize) throws Exception;
    
    /**
     * 自由分页查询
     * @param sqlQuery 自由查询配置对象
     * @param page 当前页码
     * @param pageSize 页码显示的记录数
     * @return
     */
    PageResult<Map<String, Object>>  pageSqlQuery(SqlQuery sqlQuery,int page,int pageSize) throws Exception;
}
